#!usr/bin/env python3
'''
各种扩展的笔记：

1. -------------------- flask_wtf扩展的一些笔记 -------------------

flask_wtf的字段类

StringField 文本字段
TextAreaField 多行文本字段
PasswordField 密码文本字段
HiddenField 隐藏文本字段
DateField 文本字段，值为datetime.date 格式
DateTimeField 文本字段，值为datetime.datetime 格式
IntegerField 文本字段，值为整数
DecimalField 文本字段，值为decimal.Decimal
FloatField 文本字段，值为浮点数
BooleanField 复选框，值为True 和False
RadioField 一组单选框
SelectField 下拉列表
SelectMultipleField 下拉列表，可选择多个值
FileField 文件上传字段
SubmitField 表单提交按钮
FormField 把表单作为字段嵌入另一个表单
FieldList 一组指定类型的字段

--- wtforms的验证函数 ---

Email 验证电子邮件地址
EqualTo 比较两个字段的值；常用于要求输入两次密码进行确认的情况
IPAddress 验证IPv4 网络地址
Length 验证输入字符串的长度
NumberRange 验证输入的值在数字范围内
Optional 无输入值时跳过其他验证函数
Required 确保字段中有数据
Regexp 使用正则表达式验证输入值
URL 验证URL
AnyOf 确保输入值在可选值列表中
NoneOf 确保输入值不在可选值列表中

2. -------------------- flask-sqlalchemy扩展的一些笔记 -------------------
pip3 install flask-sqlalchemy -i https://pypi.mirrors.ustc.edu.cn/
中文文档
http://www.pythondoc.com/flask-sqlalchemy/
表5-1　FLask-SQLAlchemy数据库URL
数据库引擎URI配置
MySQL mysql://username:password@hostname/database
Postgres postgresql://username:password@hostname/database
SQLite（Unix） sqlite:////absolute/path/to/database
SQLite（Windows） sqlite:///c:/absolute/path/to/database

表5-2　最常用的SQLAlchemy列类型
类型名Python类型说　　明
Integer int 普通整数，一般是32 位
SmallInteger int 取值范围小的整数，一般是16 位
BigInteger int 或long 不限制精度的整数
Float float 浮点数
Numeric decimal.Decimal 定点数
String str 变长字符串
Text str 变长字符串，对较长或不限长度的字符串做了优化
Unicode unicode 变长Unicode 字符串
UnicodeText unicode 变长Unicode 字符串，对较长或不限长度的字符串做了优化
Boolean bool 布尔值
Date datetime.date 日期
Time datetime.time 时间
DateTime datetime.datetime 日期和时间
Interval datetime.timedelta 时间间隔
Enum str 一组字符串
PickleType 任何Python 对象自动使用Pickle 序列化
LargeBinary str 二进制文件
db.Column 中其余的参数指定属性的配置选项。表5-3 列

表5-3　最常使用的SQLAlchemy列选项
选项名说　　明
primary_key 如果设为True，这列就是表的主键
unique 如果设为True，这列不允许出现重复的值
index 如果设为True，为这列创建索引，提升查询效率
nullable 如果设为True，这列允许使用空值；如果设为False，这列不允许使用空值
default 为这列定义默认值

Flask-SQLAlchemy 知识:
query = User.query.filter(User.username.ilike('%ca%')) #模糊查询


flask 知识

url_for('login', next='/') 设置next参数

url_for("main.login",_external=True) 
# url_for的 _external=True 可以获取完整http链接 http://127.0.0.1/login 如果没有则返回的是/login

'''
